#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_io.h"
#include "hi_pwm.h"
#include "hi_time.h"

#define LED_PWM_PORT    HI_PWM_PORT_PWM1  // GPIO10 对应 PWM1
#define LED_GPIO        HI_IO_NAME_GPIO_10
#define LED_PWM_FUNC    HI_IO_FUNC_GPIO_10_PWM1_OUT

// 呼吸灯参数
#define BREATH_CYCLE_MS 250  // 呼吸周期（毫秒）
#define PWM_FREQ        1000  // PWM频率（Hz）

static void BreathingLedInit(void) {
    // 初始化GPIO10为PWM功能
    hi_io_set_func(LED_GPIO, LED_PWM_FUNC);
    hi_io_set_pull(LED_GPIO, HI_IO_PULL_UP);
    hi_pwm_init(LED_PWM_PORT);
    hi_pwm_set_clock(PWM_CLK_XTAL);  // 使用外部时钟
}

static void BreathingLedTask(void *arg) {
    (void)arg;
    BreathingLedInit();

    while (1) {
        // 呼吸灯效果：从暗到亮
        for (int duty = 0; duty <= 100; duty++) {
            hi_pwm_start(LED_PWM_PORT, duty, 100);  // 占空比从0%到100%
            osDelay(BREATH_CYCLE_MS / 200);        // 控制变化速度
        }
        // 呼吸灯效果：从亮到暗
        for (int duty = 100; duty >= 0; duty--) {
            hi_pwm_start(LED_PWM_PORT, duty, 100);  // 占空比从100%到0%
            osDelay(BREATH_CYCLE_MS / 200);
        }
    }
}

static void BreathingLedEntry(void) {
    osThreadAttr_t attr = {
        .name = "BreathingLedTask",
        .stack_size = 4096,
        .priority = osPriorityNormal,
    };
    if (osThreadNew(BreathingLedTask, NULL, &attr) == NULL) {
        printf("[BreathingLed] Failed to create task!\n");
    }
}

SYS_RUN(BreathingLedEntry);  // 系统自动启动任务